app
.factory('is_weixin', function(){
	return function() {
		var pattern = /MicroMessenger/i;
		return pattern.test(navigator.userAgent);
	}
} )
.factory('id_test', function(){	
/*
 * 身份证15位编码规则：dddddd yymmdd xx p
 * dddddd：6位地区编码
 * yymmdd: 出生年(两位年)月日，如：910215
 * xx: 顺序编码，系统产生，无法确定
 * p: 性别，奇数为男，偶数为女
 * 
 * 身份证18位编码规则：dddddd yyyymmdd xxx y
 * dddddd：6位地区编码
 * yyyymmdd: 出生年(四位年)月日，如：19910215
 * xxx：顺序编码，系统产生，无法确定，奇数为男，偶数为女
 * y: 校验码，该位数值可通过前17位计算获得
 * 
 * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
 * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
 * 如果验证码恰好是10，为了保证身份证是十八位，那么第十八位将用X来代替
 * 校验位计算公式：Y_P = mod( ∑(Ai×Wi),11 )
 * i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
 */
	return function (idCard){
		//15位和18位身份证号码的正则表达式
		var regIdCard=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;

		//如果通过该验证，说明身份证格式正确，但准确性还需计算
		if(regIdCard.test(idCard)){
			if(idCard.length==18){
				var idCardWi=new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
				var idCardY=new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后，可能产生的11位余数、验证码，也保存成数组
				var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
				
				for(var i=0;i<17;i++){
					idCardWiSum+=idCard.substring(i,i+1)*idCardWi[i];
				}

				var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
				var idCardLast=idCard.substring(17);//得到最后一位身份证号码

				//如果等于2，则说明校验码是10，身份证号码最后一位应该是X
				if(idCardMod==2){
					if(idCardLast=="X"||idCardLast=="x"){
						return true;
					}else{
						return false;
					}
				}else{
					//用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
					if(idCardLast==idCardY[idCardMod]){
						return true;
					}else{
						return false;
					}
				}
			} 
		}else{
			return false;
		}
	}	
} )
//时间拦截器
.factory('timestampMarker', [function() {
	var dateStart = null;
    var timestampMarker = {
        request: function(config) {
			dateStart = new Date();
            return config;
        },
        response: function(response) {
			var arr = [];
			arr.push(response.config.method);	//GET、POST等	
			arr.push(response.config.url);	//url
			arr.push(response.status);	//状态码
			arr.push(response.statusText);	//状态文字
			arr.push((new Date()).getTime() - dateStart.getTime() + "ms");	
			console.log(arr.join(" "));
            return response;
        }
    };
    return timestampMarker;
}])
//保存拦截器
.factory('saveAjax', ['$location',function($location) {
    var saveAjax = {
        response: function(response) {
			if ( response.config.method=='PUT') {
					swal(
						{   
							title: "操作成功",   
							text: "按“确定”按钮返回",   
							type: "success",   
							//showCancelButton: true,
							//cancelButtonText: '取消',
							confirmButtonColor: "#DD6B55",   
							confirmButtonText: "确定",   
							closeOnConfirm: true
							//closeOnCancel: false
						});	
			}
            return response;
        },
		responseError: function(response) {
			if ( response.config.method=='PUT') {
				swal({
				title: "操作失败",
				text: response.statusText,
				type: "error",
				confirmButtonColor: "#DD6B55",
				confirmButtonText: "确定",
				closeOnConfirm: true }
			);	
			}
            return response;
		}
    };
    return saveAjax;
}])
//请求的时候加遮罩层，返回的时候去掉遮罩层
.factory('requestOverlay', ['$location',function($location) {
    var requestOverlay = {
        request: function(config) {
			if ( !HIDE_MASK )
			OVERLAY_MASK.style.display = "block";
			return config;
        },
		requestError: function(config) {
			if ( !HIDE_MASK )
			OVERLAY_MASK.style.display = "none";
			return config;			
		},
        response: function(response) {		
			if ( !HIDE_MASK )
			OVERLAY_MASK.style.display = "none";
			return response;
        },
		responseError: function(response) {	
			if ( !HIDE_MASK )
			OVERLAY_MASK.style.display = "none";
			return response;			
		}
    };
	HIDE_MASK = false;
    return requestOverlay;
}])
/*
有时候，我们的单页面应用中，会发生丢失 session 情况。这种情况可能由于 session 过期了或者服务器异常。我们来创建一个拦截器，用于恢复 session 然后自动重新发送原始请求(假设 session 过期的情况)。

为了演示目的，我们来假设发生了 session 过期返回 http 状态码 419。
*/
.factory('sessionRecoverer', ['$q', '$injector', function($q, $injector) {
    var sessionRecoverer = {
        responseError: function(response) {
            // Session has expired
            if (response.status == 419){
                var SessionService = $injector.get('SessionService');
                var $http = $injector.get('$http');
                var deferred = $q.defer();

                // Create a new session (recover the session)
                // We use login method that logs the user in using the current credentials and
                // returns a promise
                SessionService.login().then(deferred.resolve, deferred.reject);

                // When the session recovered, make the same backend call again and chain the request
                return deferred.promise.then(function() {
                    return $http(response.config);
                });
            }
            return $q.reject(response);
        }
    };
    return sessionRecoverer;
}])
.factory('fileReader', ["$q", "$log", function($q, $log){
	var onLoad = function(reader, deferred, scope) {
		return function () {
			scope.$apply(function () {
				deferred.resolve(reader.result);
			});
		};
	};
	var onError = function (reader, deferred, scope) {
		return function () {
			scope.$apply(function () {
				deferred.reject(reader.result);
			});
		};
	};
	var getReader = function(deferred, scope) {
		var reader = new FileReader();
		reader.onload = onLoad(reader, deferred, scope);
		reader.onerror = onError(reader, deferred, scope);
		return reader;
	};
	var readAsDataURL = function (file, scope) {
		var deferred = $q.defer();
		var reader = getReader(deferred, scope);
		reader.readAsDataURL(file);
		return deferred.promise;
	};
	return {
		readAsDataUrl: readAsDataURL
	};
}])
;